iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Vue.js

用 Nuxt Content 搭配 Obsidian 建立自己的 Digital Garden系列 第 29

將 Digital Garden 部署到網路上

  • 分享至 

  • xImage
  •  

從第 4 篇文章開始,到第 28 篇,陸續寫了許多功能,也是時候將成果給部署到網路上了。其實部署應該是要在第 5 篇就要寫了,這樣才能持續發布,但礙於鐵人賽時每天寫文章(尤其是一天要寫四篇)總得酌量自己當天能寫的份量,所以最後只好將部署放到這時候了。或許之後再做總集篇時,可以再做調整吧!

本篇會說明如何使用 GitHub Pages,將基於 Nuxt Content 的 Digital Garden 部署到網路上。

前置作業

在開始前有些前置作業需要進行,分別是:

  • 自定義網域名稱
  • GitHub 設定
    • 將文章上傳到 GitHub Repository A
    • 將程式碼上傳到 GitHub Repository B
      • 啟用 GitHub Pages

自定義網域名稱

這邊會需要準備一個 domain,關於這部分已經有許多文章在描述了,本篇就先不詳述。

可以先到偏好的網域提供商購買網址,再透過偏好的 DNS 服務商設定網址,並將 Record 透過 CNAME 綁定到 <github-username.github.io

比如說筆者是透過 Gandi 購買 fntsr.tw 網域,並透過 CloudFlare 將 iron23 綁定到 fntrlike.github.io

GitHub 設定

由於前面〈將文章與網站的版本控制分離〉將內文與網站程式碼分離了,所以會有兩個 Git Repository,所以要先到 GitHub 建立兩個 Repository 並推送到專案上。這裡分別命名為:

  • Repository A: ironman-23-garden-contents
  • Repository B: ironman-23-digital-graden

上傳後,要到 Repository B 去啟用 GitHub Pages。

  1. 先點擊 Repository 的 Setting
  2. 在左側邊欄選擇 Pages
  3. 在右側主畫面的 Source 下拉式選單中選取 GitHub Actions。

接著填寫 Custom domain 的欄位,把上面設定好的網域填寫進去。接著會需要一段時間進行驗證,驗證成功就會顯示綠色的勾勾與訊息。

如果有遇到任何問題,可以參見 Configuring a custom domain for your GitHub Pages site - GitHub Docs

編寫 GitHub Action 設定

接著就要來編寫 GitHub Action 的設定檔,首先建立 @/.github/workflows/pages.yml,檔案名稱不影響執行,但因為接下來寫的是部署到 GitHub Page,所以暫名為 page.yml

接下來的檔案結構整體大致如下,為了方便解說,會逐著拆分解釋。

name: Deploy Nuxt site to Pages

on:
  ...
permissions:
  ...
concurrency:
  ...

jobs:
  build:
    ...
  deploy-to-github-pages:
    ...
  clean-up:
    ...

下面這段是定義了 workflow 的名稱,他會顯示在 GitHub Actions 的左側邊欄的部分,作為一個篩選器,讓同一個 workflow 的執行結果放在一起。

name: Deploy Nuxt site to Pages

on 語法決定了這個 workflow 的觸發條件,下列程式碼則限定本 workflow 在 main branch 有推送事件時,會觸發執行。其他事件可以參照 Workflow syntax: on Events that trigger workflows

on:
  push:
    branches: ["main"]

permission 則限定了這個 workflow 所擁有的權限

  • content 為 repository 的權限,這邊是唯讀
  • pages 為 GitHub Pages 部署空間的權限,這邊是可以寫入。
  • id-token 則則
permissions:
  contents: read
  pages: write
  id-token: write

接下來聊聊 build job 的部分,主要的 steps 有:

  1. Checkout
  2. Install Node.js
  3. Install pnpm
  4. Get pnpm store directory
  5. Setup pnpm cache
  6. Install dependencies
  7. Get blog posts
  8. Export static HTML artifact
  9. Upload artifact
  • 「1. Checkout」是將程式碼從 GitHub 下載下來。
  • 從「2. Install Node.js」到「6. Install dependencies」是在設定建置環境,包括複用 pnpm 的 node packages。
  • 「7. Get blog posts」則是抓取 Repository B 的內容?
  • 「8. Export static HTML artifact」則為建制
  • 「9. Upload artifact」則是上傳到 Artifact,準備給 Deploy 的 job 使用。
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Install pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8
          run_install: false

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v3
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - name: Install dependencies
        run: pnpm install

      - name: Get blog posts
        uses: actions/checkout@v4
        with:
          repository: ${{ vars.CONTENT_REPO }}
          ref: main
          path: ./_write

      - name: Static HTML export with Nuxt
        run: pnpm run generate

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v2
        with:
          name: deployment
          path: ./dist
  

最後聊聊 Deploy 的部分,這邊 step 只有一個。needs 是指這個 job 相依於哪一個 job,要等相依的 job 完成才會執行本 job。environment 則可以協助我們在 GitHub Action 直接顯示我們的連結,可參見下圖。

steps 的部分,使用的是 GitHub 的 actions/deploy-pages@v2,他能協助我們不用設定就部署到 GitHub Pages。並透過 with 指定我們要使用哪個 artifact 去作為網站資料。

jobs:
  build:
    # .....  
      
  deploy-to-github-pages:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: github-pages
      url: ${{ steps.github-deployment.outputs.page_url }}
    steps:
      - id: github-deployment
        name: Deploy to GitHub Pages
        uses: actions/deploy-pages@v2
        with:
          artifact_name: deployment

部署完,點擊連結就可以到我們的 Digital Garden 啦!


上一篇
為 Digital Garden 新增留言功能
下一篇
結語
系列文
用 Nuxt Content 搭配 Obsidian 建立自己的 Digital Garden30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言